﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.ginv
    求矩阵广义逆的奇异值分解法
    参数 a: a[m]n]存放m×n的实矩阵A。返回时其对角线给出奇异值（以非递增次序排列），其余元素均为0。
    参数 m: 
    参数 n: 
    参数 aa: b[n][m]返回A的广义逆。
    参数 eps: 给定的精度要求。
    参数 u: u[m][m]返回左奇异向量U。
    参数 v: v[n][n]返回右奇异向量V。
    参数 ka: 其值为max(m，n)＋1。
    参数 inter: 最多迭代次数，100
    返回值 若小于0，则表示失败；若大于0，则表示正常。
    */

    public static string drive_ginv()
    {
        int m, n, ka, i, j;
        double[,] a = new double[5, 4]{
            {1.0,2.0,3.0,4.0},
            {6.0,7.0,8.0,9.0},
            {1.0,2.0,13.0,0.0},
            {16.0,17.0,8.0,9.0},
            {2.0,4.0,3.0,4.0}
        };
        double[,] aa = new double[4, 5];
        double[,] c = new double[5, 4];
        double[,] u = new double[5, 5];
        double[,] v = new double[4, 4];
        double eps;

        m = 5;
        n = 4;
        ka = Math.Max(m, n) + 1;// 6;
        eps = 0.000001;

        i = gl.ginv(a, m, n, aa, eps, u, v, ka, 100);
        if (i < 0) return "error " + i;
        string rs = gl.html_table("Mat A:", a) +
                    gl.html_table("Mat A+:", aa) +
                    gl.html_table("Mat U:", u) +
                    gl.html_table("Mat V:", v);

        i = gl.ginv(aa, n, m, c, eps, v, u, ka, 100);
        if (i < 0) return "error " + i;

        rs += gl.html_table("Mat A++:", c);

        return rs;

    }
}